// miniprogram/pages/music-play/music-play.js
import request from '../../request/index'
//使用 async await 语法必须引入，固定写法。
import regeneratorRuntime from '../../utils/runtime'
const App = getApp()
Page({

  /**
   * 页面的初始数据
   */
  data: {
    songInfo: {},//歌曲信息
    isPlay: true,//是否正在播放
    position: 0,//小圆点位置
    totalTime: 0,//歌曲总时长
    currentTime: 0,//当前播放时长
    isCoverImage: true,//显示封面或者歌词
    lrcTime: [],//歌词显示时间,
    lrcFilter: [],//歌曲歌词(去除前面时间)
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    const { id } = options
    wx.showLoading({
      title: "加载中~",
      mask: true,
    })
    this.getMusicDetail(id)
  },
  //获取歌曲详情并播放
  async getMusicDetail(ids) {
    const result = await request({ url: "song/detail", data: { ids } })
    this.getMusicLyric(ids)
    if (result.code !== 200) {
      console.log("获取歌曲失败", result)
      return
    }
    const songInfo = result.songs[0]
    const { name, ar, al, id } = songInfo
    //如果点击的歌曲是上一次点击的
    if (parseInt(App.globalData.musicId) === ids) {
      //如果歌曲正处于暂停
      if (App.globalData.backgroundAudioManager.paused) {
        this.setData({ isPlay: false })
      }
      //初始化页面数据(上一次播放的数据)
      this.setData({
        totalTime: App.globalData.backgroundAudioManager.duration && App.globalData.backgroundAudioManager.duration.toFixed(2),
        currentTime: App.globalData.backgroundAudioManager.currentTime.toFixed(2),
        position: (App.globalData.backgroundAudioManager.currentTime /
          App.globalData.backgroundAudioManager.duration * 484).toFixed(2),
        songInfo
      })
      //重新监听音乐播放事件
      App.globalData.backgroundAudioManager.onTimeUpdate(() => {
        this.setData({
          totalTime: App.globalData.backgroundAudioManager.duration && App.globalData.backgroundAudioManager.duration.toFixed(2),
          currentTime: App.globalData.backgroundAudioManager.currentTime.toFixed(2),
          position: (App.globalData.backgroundAudioManager.currentTime /
            App.globalData.backgroundAudioManager.duration * 484).toFixed(2),
          songInfo
        })
      })
      return
    }
    //将播放音乐的id保存下来
    App.globalData.musicId = ids
    // 获取全局唯一的背景音频管理器实例
    App.globalData.backgroundAudioManager = wx.getBackgroundAudioManager()
    //音频标题，用于原生音频播放器音频标题（必填）
    App.globalData.backgroundAudioManager.title = name
    //专辑名，原生音频播放器中的分享功能
    App.globalData.backgroundAudioManager.epname = al.name
    //歌手名，原生音频播放器中的分享功能
    App.globalData.backgroundAudioManager.singer = ar[0].name
    //封面图 URL，用于做原生音频播放器背景图
    App.globalData.backgroundAudioManager.coverImgUrl = al.picUrl
    App.globalData.backgroundAudioManager.src =
      `https://music.163.com/song/media/outer/url?id=${id}.mp3`
    //监听背景音频播放进度更新事件，只有小程序在前台时会回调
    App.globalData.backgroundAudioManager.onTimeUpdate(() => {
      this.setData({
        totalTime: App.globalData.backgroundAudioManager.duration && App.globalData.backgroundAudioManager.duration.toFixed(2),
        currentTime: App.globalData.backgroundAudioManager.currentTime.toFixed(2),
        position: (App.globalData.backgroundAudioManager.currentTime /
          App.globalData.backgroundAudioManager.duration * 484).toFixed(2),
        songInfo
      })
      //想实现歌词联动，但是暂时没有想到实现方法
      // this.data.lrcTime.find(item => {
      //   if(parseFloat(App.globalData.backgroundAudioManager.currentTime.toFixed(2)) === parseFloat(item)){
      //     console.log(true)
      //   }
      // })
    })
    //监听音乐播放事件
    App.globalData.backgroundAudioManager.onPlay(() => {
      //调用添加播放记录的云函数
      wx.cloud.callFunction({
        name:"addmphistory",
        data:{songInfo:{name, ar, al, id}}
      })
    }),
    //建议音乐播放完成事件
    App.globalData.backgroundAudioManager.onEnded(() => {
      if (App.globalData.index === App.globalData.playList.length - 1) {
        App.globalData.index = 0
      }
      if(App.globalData.playList.length === 1){
        App.globalData.index = -1
      }
      App.globalData.index++
      //递归调用自己
      this.getMusicDetail(App.globalData.playList[App.globalData.index].id)
    })
    //监听音乐播放错误(会员歌曲无法获取)
    App.globalData.backgroundAudioManager.onError((res) => {
      if (App.globalData.index === App.globalData.playList.length - 1) {
        App.globalData.index = 0
      } else {
        App.globalData.index++
      }
      this.getMusicDetail(App.globalData.playList[App.globalData.index].id)
      wx.showToast({
        title: '获取歌曲失败~',
        icon: 'none',
        duration: 1500,
        mask: false,
      })
    })
  },
  //获取歌曲歌词
  async getMusicLyric(id) {
    const result = await request({ url: 'lyric', data: { id } })
    if (result.code !== 200) {
      console.log('获取歌词失败', result)
      return
    }
    if (!result.lrc) {
      const lrcFilter = ["暂无歌词"]
      this.setData({ lrcFilter })
      return
    }
    const lyric = result.lrc.lyric
    const lrc = lyric.split('\n')
    let lrcTime = []
    const lrcFilter = lrc.map(item => {
      const time = item.match(/^\[.*\]/)
      if (time) {
        const formatTime =
          (parseFloat(time[0].slice(1, 3) * 60) +
            parseFloat(time[0].slice(4, time[0].length - 1)))
            .toFixed(2)
        lrcTime.push(formatTime)
      }
      return item.replace(/^\[.*\]/, "")
    })
    this.setData({ lrcTime, lrcFilter })
  },
  //播放或暂停
  playPause() {
    if (this.data.isPlay) {
      App.globalData.backgroundAudioManager.pause()
    } else {
      App.globalData.backgroundAudioManager.play()
    }
    this.setData({ isPlay: !this.data.isPlay })
  },
  //上一首
  lastMusic() {
    if (App.globalData.index === 0) {
      App.globalData.index = App.globalData.playList.length - 1
    } else {
      App.globalData.index--
    }
    this.getMusicDetail(App.globalData.playList[App.globalData.index].id)
    this.setData({ isPlay: true })
  },
  //下一首
  nextMusic() {
    if (App.globalData.index === App.globalData.playList.length - 1) {
      App.globalData.index = 0
    } else {
      App.globalData.index++
    }
    this.getMusicDetail(App.globalData.playList[App.globalData.index].id)
    this.setData({ isPlay: true })
  },
  //切换歌词或者封面
  toggleImgLyr(event) {
    const { name } = event.currentTarget.dataset
    if (name === 'img') {
      this.setData({ isCoverImage: false })
    } else {
      this.setData({ isCoverImage: true })
    }
  },
  //监听图片加载完成
  imageLoad() {
    wx.hideLoading()
  },
  //去到歌手详情也买你
  goSingerPage(event) {
    const {id} = event.currentTarget.dataset
    wx.redirectTo({url: '/pages/singer/singer?id=' + id})
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})